const db = require("../db")
const bcrypt = require("bcryptjs") // 引入加密包
const jwt = require("jsonwebtoken")
const { secretKey } = require("../config")
/**
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用
 */
const usernameSql = "select count(*) as count from users where username=?" // 查询用户名是否被占用
const insertSql = "insert into users set ?" // 插入注册用户、
const getUserSql = "select * from users where username=?" // 查询用户名的记录
// 注册用户的处理函数
exports.regUser = (req, res) => {
  // 注册逻辑
  const { username, password } = req.body
  if (!username || !password) {
    res.sendError("用户名或者密码不能为空")
    return
  }
  db.query(usernameSql, username, function (err, result) {
    if (!err) {
      const [{ count }] = result
      if (count > 0) {
        // 表示用户名已经被占用
        res.sendError(`${username}用户名已经被占用`)
      } else {
        // 用户名没有占用·
        // console.log(bcrypt.hashSync(password, 10))
        // 拿到加密之后的密码 => 赋值给原密码
        req.body.password = bcrypt.hashSync(password, 10) // 将明文密码进行加密 赋值给原来的属性
        // 插入注册用户
        db.query(insertSql, req.body, function (error, data) {
          if (!error) {
            res.send({ message: "用户注册成功", status: 0 })
          } else {
            res.sendError(error)
          }
        })
      }
    }
  })
  // 检测用户名是否被占用
  // res.send("reguser OK")
}

// 登录的处理函数
exports.login = (req, res) => {
  const { username, password } = req.body // 取出登录名和密码
  // 因为密码数据库存储的是加密的 不能直接比较
  // 1. 先去查 用户名等于username的记录
  db.query(getUserSql, username, function (err, result) {
    if (!err && result.length) {
      // 此时认为查询成功

      // 这里要比较密码 只有密码对比成功 才认为 登录是ok的
      if (bcrypt.compareSync(password, result[0].password)) {
        // 此时表示 用户名对上了  密码也对上了
        // 接下来需要实现jwt的加密 => 前后分离模式下 后端响应给前端的一个令牌   token  header.payload.signuare
        const user = { ...result[0], user_pic: "", password: "" } // userpic base64 长度太大 加密长度无法控制 password 敏感数据也要去掉
        //   jwt.sign(user, secretKey, { expiresIn: "10h" }) // 加密字符串 生成token
        res.send({
          message: "登录成功",
          status: 0,
          token: "Bearer " + jwt.sign(user, secretKey, { expiresIn: "10h" }), // 大事件项目不需要做任何改变 就可以使用token
        })
      } else {
        res.sendError("用户名或者密码错误")
      }
    } else {
      res.sendError(err ? err : "用户名没有注册")
    }
  })
}
